package com.note.feng.leetcode.algorithms.easy.linked;

public class LinkedList {

    /**
     * 21 合并两个有序链表
     *将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 
     *
     * 示例 1：
     *
     * 输入：l1 = [1,2,4], l2 = [1,3,4]
     * 输出：[1,1,2,3,4,4]
     * 示例 2：
     *
     * 输入：l1 = [], l2 = []
     * 输出：[]
     * 示例 3：
     *
     * 输入：l1 = [], l2 = [0]
     * 输出：[0]
     *  
     * 提示：
     *
     * 两个链表的节点数目范围是 [0, 50]
     * -100 <= Node.val <= 100
     * l1 和 l2 均按 非递减顺序 排列
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/merge-two-sorted-lists
     * @param list1
     * @param list2
     * @return
     */
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        if(list1 == null){
            return list2;
        }
        if(list2 == null){
            return list1;
        }
        ListNode res = new ListNode();
        ListNode list = res;
        ListNode pre = list1;
        ListNode nextNode = list2;
        while(true){
            if(pre.val > nextNode.val){
                list.next = nextNode;
                nextNode = nextNode.next;
            }else{
                list.next = pre;
                pre = pre.next;
            }
            list = list.next;
            if(pre == null || nextNode == null){
                break;
            }
        }
        if(pre == null){
            list.next = nextNode;
        }
        if(nextNode == null){
            list.next = pre;
        }
        return res.next;
    }

    public static void main(String [] args){

    }

    public class ListNode {
      int val;
      ListNode next;
      ListNode() {}
      ListNode(int val) { this.val = val; }
      ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    }
}
